package com.lb.uts.service.manager;

import java.util.ArrayList;
import java.util.List;

/**
 * 缓存数据修改
 * 为了避免多线程问题<p>
 * 实现一个堵塞队列，有专门的线程负责更新
 * 不提供其他的修改入口
 * </p>
 *
 * @author liangb
 * @version 3.0
 * @date 2019/4/30 11:16
 */
public class ModifyManager {

    /**
     * 一个队列
     */
    public static class ModifyQueue {

        private List<Object> queue;

        private int capacity = 10;

        public ModifyQueue(int capacity) {
            if (capacity <= 0) {
                throw new IllegalArgumentException("capacity 不能小于等于0");
            }
            this.capacity = capacity;
            queue = new ArrayList<>(capacity);
        }

        /**
         * 默认大小10
         */
        public ModifyQueue() {
            queue = new ArrayList<>(capacity);
        }

        /**
         * 获取队列当前的数据
         *
         * @return 队列的大小
         */
        public int size() {
            return queue.size();
        }


        /**
         * 向队列中添加
         *
         * @param obj
         */
        public void add(Object obj) {
            if (size() + 1 > capacity) {
                throw new IllegalStateException("队列越界");
            }
            queue.add(obj);
        }

        /**
         * 移除一个元素
         *
         * @param obj
         */
        public void remove(Object obj) {
            queue.remove(obj);
        }


        /**
         * 获取一个元素
         *
         * @param index
         * @return
         */
        public Object get(int index) {
            if (index < 0) {
                throw new IllegalArgumentException("index 不能小于0");
            }
            return queue.get(index);
        }

    }

    public static ModifyQueue modifyQueue = new ModifyQueue(1);

    /**
     * 添加元素
     *
     * @param obj
     * @return
     */
    public static int add(Object obj) {
        if (modifyQueue.size() == 1) {
            //不再放入
        } else {
            modifyQueue.add(obj);
            return 1;
        }
        return -1;
    }

    public static int addEmpty() {
        return add(1);
    }

    public static int getSize() {
        return modifyQueue.size();
    }

    public static int remove(Object obj) {
        if (getSize() >= 0) {
            modifyQueue.remove(obj);
            return 1;
        }
        return -1;
    }

    /**
     * 获取一个元素，如果没有获取到则睡眠一定时间
     *
     * @param index
     * @param tryTime
     * @return
     * @throws Exception
     */
    public static Object get(int index, int tryTime) throws Exception {
        if (getSize() > 0) {
            return modifyQueue.get(index);
        }
        Thread.sleep(tryTime);
        return null;
    }

}
